/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modeloprediccion;

import java.sql.*;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import motorprediccion.DatoPosicional;
import motorprediccion.DatoProcesado;
import motorprediccion.Parada;
import motorprediccion.Recorrido;

/**
 *
 * @author diego
 */
public abstract class Modelo {
    ArrayList<DatoProcesado> predic;
    ArrayList<Recorrido> recorridos;
    HashMap<Integer, DatoPosicional> posiciones;
    GregorianCalendar fechaActualizacion;

    public abstract Integer procesarNuevosTiempos(ArrayList<DatoPosicional> posicionesNuevas);
    public abstract Double obtenerPrediccion(Integer linea, Integer origen, Integer destino);
    public void actualizarValoresParametros(){}

    public Modelo() {
        this.posiciones = new HashMap<Integer,DatoPosicional>();
        this.recorridos = new ArrayList<Recorrido>();
        this.actualizarRecorridos();
        this.fechaActualizacion = new GregorianCalendar();
    }

    public DatoPosicional getPosicion(Integer id) {
        if (this.posiciones.isEmpty())
            return null;
        else
            return this.posiciones.get(id);
    }
    
    public Recorrido getRecorridos(Integer id) {
        Integer i=0;
        do {
            i++;
        } while (i< recorridos.size()||recorridos.get(i).getId() == id);
        if (i == recorridos.size())
            return null;
        else
            return recorridos.get(i);
    }

    public void agregarRecorrido(Recorrido linea){
        recorridos.add(linea);
    }
    
    public void setParametro(String nombre, String valor){
        //funcion que guarda un parametro en la BD
        try {
            Connection conexionBD = DriverManager.getConnection("jdbc:postgresql://localhost/sistemaprediccion",
                                            "postgres", "postgres");
            //controlar que sea nuevo o actualizacion
            String consulta = this.getParametro(nombre); 
            if (consulta == null){
                consulta = "INSERT INTO parametros(nombre, valor) "+
                    "VALUES ('" + nombre + "', '" + valor +"');\n";
            }
            else {
                consulta = "UPDATE parametros SET valor= '" + valor + 
                        "' WHERE nombre = '"+ nombre +"';\n";
            }
            Statement s= conexionBD.createStatement();
            s.executeUpdate(consulta);
            conexionBD.close();
        }
        catch (SQLException se) {
          System.out.println("Error en la BD");
          se.printStackTrace();
          System.exit(1);
        }
    }
    
    public String getParametro(String nombre){
        //funcion que retorna el valor de un parametro en un String
        String valor = null;
        try {
            Connection conexionBD = DriverManager.getConnection("jdbc:postgresql://localhost/sistemaprediccion",
                                            "postgres", "postgres");
            String consulta = "SELECT parametros.valor FROM public.parametros WHERE "+
                    "parametros.nombre = '"+ nombre +"';\n";
            Statement s= conexionBD.createStatement();
            ResultSet resultado = s.executeQuery(consulta);
            while(resultado.next()) {
                valor = resultado.getString("valor");
            }
            conexionBD.close();
        }
        catch (SQLException se) {
          System.out.println("Error en la BD");
          se.printStackTrace();
          System.exit(1);
        }
        return valor;
    }
    
    public void actualizarRecorridos() {
        if(this.recorridos.size()>0){
            this.recorridos.clear();
        }
        try {
            Connection conexionBD = DriverManager.getConnection("jdbc:postgresql://localhost/sistemaprediccion",
                                "postgres", "postgres");
            String consultaParadas, consultaLineas = "SELECT idrecorrido, linea, frecuencia, empresa_id FROM recorrido;";
            ResultSet resultadoParadas, resultadoLineas;
            Statement s = conexionBD.createStatement();
            resultadoLineas = s.executeQuery(consultaLineas);
            
            while(resultadoLineas.next()){ // corregir carga de recorridos
                this.recorridos.add(new Recorrido(resultadoLineas.getInt("idrecorrido"),resultadoLineas.getString("linea")));
            }
            for (Integer i=0; i<this.recorridos.size(); i++){
                consultaParadas = "SELECT idparada, linea_id, calle1, calle2, proximaparada, latitud, longitud, orden"+
                " FROM parada WHERE linea_id = "+ this.recorridos.get(i).getId() +" order by orden;";
                resultadoParadas = s.executeQuery(consultaParadas);
                while(resultadoParadas.next()) {
                    double lat = resultadoParadas.getDouble("latitud");
                    double lon = resultadoParadas.getDouble("longitud");
                    this.recorridos.get(i).agregarParada(new Parada(resultadoParadas.getInt("idparada"), resultadoParadas.getInt("orden"), lat, lon));
                }
            }
        }
        catch (SQLException se) {
          System.out.println("SQL Error");
          se.printStackTrace();
          System.exit(1);
        }
    }
    
        public Integer getIdRecorridoUnidad(Integer idUnidad){
        //funcion que retorna el valor de un parametro en un String
        int valor = 0;
        try {
            Connection conexionBD = DriverManager.getConnection("jdbc:postgresql://localhost/sistemaprediccion",
                                            "postgres", "postgres");
            String consulta = "SELECT unidad.linea_id FROM public.unidad WHERE "+
                    "unidad.idunidad = '"+ idUnidad +"';\n";
            Statement s= conexionBD.createStatement();
            ResultSet resultado = s.executeQuery(consulta);
            while(resultado.next()) {
                valor = resultado.getInt("linea_id");
            }
            conexionBD.close();
        }
        catch (SQLException se) {
          System.out.println("Error en la BD");
          se.printStackTrace();
          System.exit(1);
        }
        return valor;
    }
}
